/******************************************************************************
 * 
 * Announce: CSharpKit, Basic algorithms, components and definitions.
 *           Copyright (C) ShenYongchen.
 *           All rights reserved.
 *   Author: 申永辰.郑州 (shenyczz@163.com)
 *  WebSite: http://gitee.com/shenyczz/csharp_csk
 *
 * THIS CODE IS LICENSED UNDER THE MIT LICENSE (MIT).
 * THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF 
 * ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY
 * IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR
 * PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.
 * 
******************************************************************************/

using System;
using System.IO;
using System.Runtime.InteropServices;

namespace CSharpKit.Native.ECCODES
{
    partial class eccodes
    {
        /// <summary>
        /// 原型: FILE* sfx_codes_fopen(const char* fname, const char* mode) <br/>
        /// 功能: 打开文件 <br/>
        /// 状态:  <br/>
        /// r    以只读方式打开文件，该文件必须存在。 <para/>
        /// r+   以读/写方式打开文件，该文件必须存在。 <para/>
        /// rb+  以读/写方式打开一个二进制文件，只允许读/写数据。 <para/>
        /// rt+  以读/写方式打开一个文本文件，允许读和写。 <para/>
        /// w    打开只写文件，若文件存在则文件长度清为零，即该文件内容会消失；若文件不存在则创建该文件。 <para/>
        /// w+   打开可读/写文件，若文件存在则文件长度清为零，即该文件内容会消失；若文件不存在则创建该文件。 <para/>
        /// a    以附加的方式打开只写文件。若文件不存在，则会创建该文件；如果文件存在，则写入的数据会被加到文件尾后，即文件原先的内容会被保留（EOF 符保留）。 <para/>
        /// a+   以附加方式打开可读/写的文件。若文件不存在，则会创建该文件，如果文件存在，则写入的数据会被加到文件尾后，即文件原先的内容会被保留（EOF符不保留）。 <para/>
        /// wb   以只写方式打开或新建一个二进制文件，只允许写数据。 <para/>
        /// wb+  以读/写方式打开或新建一个二进制文件，允许读和写。 <para/>
        /// wt+  以读/写方式打开或新建一个文本文件，允许读和写。 <para/>
        /// at+  以读/写方式打开一个文本文件，允许读或在文本末追加数据。 <para/>
        /// ab+  以读/写方式打开一个二进制文件，允许读或在文件末追加数据。 <para/>
        /// </summary>
        /// <param name="path"></param>
        /// <param name="mode"></param>
        /// <returns> </returns>
        [DllImport(_dllname_, CharSet = CharSet.Ansi, EntryPoint = "sfx_codes_fopen")]
        internal extern static IntPtr sfx_codes_fopen(string path, string mode);

        /// <summary>
        /// 打开文件
        /// </summary>
        /// <param name="path"></param>
        /// <param name="mode"></param>
        /// <returns></returns>
        public static IntPtr codes_fopen(string path, FileOpenModel mode = FileOpenModel.Read)
        {
            string smode = "rb";

            switch (mode)
            {
                case FileOpenModel.Read: smode = "rb"; break;
                case FileOpenModel.Write: smode = "wb"; break;
                default: break;
            }

            return sfx_codes_fopen(path, smode);
        }

        /// <summary>
        /// 原型: int sfx_codes_fclose(FILE* f) <br/>
        /// 功能:  <br/>
        /// 状态:  <br/>
        /// </summary>
        /// <param name="f"></param>
        /// <returns> </returns>
        [DllImport(_dllname_, CharSet = CharSet.Ansi, EntryPoint = "sfx_codes_fclose")]
        internal extern static int sfx_codes_fclose_(IntPtr f);
        public static int codes_fclose(IntPtr hfile)
        {
            return (hfile == IntPtr.Zero) ? (-1) : sfx_codes_fclose_(hfile);
        }

        // {{END}}
    }

}

